Bug 351679 - Notebooks drawn with extra line below tab in MS-Windows
authorDom Lachowicz <domlachowicz@gmail.com>
Thu, 14 Dec 2006 02:09:27 +0000 (02:09 +0000)
committerDom Lachowicz <doml@src.gnome.org>
Thu, 14 Dec 2006 02:09:27 +0000 (02:09 +0000)
2006-12-13  Dom Lachowicz <domlachowicz@gmail.com>

* src/modules/engines/ms-windows/msw_style.c: Bug 351679 - Notebooks
drawn with extra line below tab in MS-Windows theme. Patch by
Cody Russell

ChangeLog
modules/engines/ms-windows/msw_style.c

index 9751cbce2d2109e078a835fcbc75bdec6f66566b..fa387233359db0ff47081dc2b5ed043b84aa5edd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-12-13  Dom Lachowicz <domlachowicz@gmail.com>
+
+       * src/modules/engines/ms-windows/msw_style.c: Bug 351679 - Notebooks 
+       drawn with extra line below tab in MS-Windows theme. Patch by 
+       Cody Russell
+       
 2006-12-13  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/Makefile.am: Add --unlink-tempfile to the evince call
index 235a52235aeec8d18e2dd797d0c501eecdc2b5a4..dcb34fd880e8730c7ba9930d8d9586cff57c64f2 100755 (executable)
@@ -2405,12 +2405,14 @@ draw_extension (GtkStyle * style,
            GtkNotebook *notebook = GTK_NOTEBOOK (widget);
            GdkPixmap *pixmap = NULL;
            GdkDrawable *target = NULL;
-           gint x2, y2, w2, h2;
+           gint x2 = 0, y2 = 0, w2 = width, h2 = height;
            int tab_part = XP_THEME_ELEMENT_TAB_ITEM;
            int real_gap_side = gtk_notebook_get_tab_pos (notebook);
+           int border_width = gtk_container_get_border_width (GTK_CONTAINER (notebook));
+           gboolean last_tab;
 
            /* why this differs from the above gap_side, i have no idea... */
-           if (real_gap_side == GTK_POS_LEFT || real_gap_side == GTK_POS_RIGHT)
+           if (real_gap_side == GTK_POS_LEFT)
              {
                /* Create "rotated" pixmap.. swap width and height */
                pixmap = gdk_pixmap_new (window, height, width, -1);
@@ -2418,15 +2420,64 @@ draw_extension (GtkStyle * style,
                x2 = 0;
                y2 = 0;
                w2 = height;
-               h2 = width;
+               h2 = width - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_hborder);
+
+               /* If we are currently rendering the bottom-most tab, and if that tab is the selected tab... */
+               if (widget->allocation.y + widget->allocation.height - border_width == y + height &&
+                   state_type == GTK_STATE_NORMAL)
+                 {
+                   w2--;
+                 }
              }
-           else
+           else if (real_gap_side == GTK_POS_RIGHT)
+             {
+               /* Create "rotated" pixmap.. swap width and height */
+               x2 = 0;
+               y2 = 0;
+               w2 = height;
+               h2 = width - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_hborder);
+               pixmap = gdk_pixmap_new (window, w2, h2, -1);
+               target = pixmap;
+
+               /* If we are currently rendering the bottom-most tab, and if that tab is the selected tab... */
+               if (widget->allocation.y + widget->allocation.height - border_width == y + height &&
+                   state_type == GTK_STATE_NORMAL)
+                 {
+                   w2--;
+                 }
+             }
+           else if (real_gap_side == GTK_POS_TOP)
              {
                target = window;
                x2 = x;
                y2 = y;
                w2 = width;
-               h2 = height;
+               if (state_type == GTK_STATE_NORMAL)
+                 h2 = height;
+               else
+                 h2 = height - notebook->tab_vborder;
+
+               /* If we are currently drawing the right-most tab, and if that tab is the selected tab... */
+               if (widget->allocation.x + widget->allocation.width - border_width == x + width &&
+                   state_type == GTK_STATE_NORMAL)
+                 {
+                   x2--;
+                 }
+             }
+           else if (real_gap_side == GTK_POS_BOTTOM)
+             {
+               x2 = x;
+               y2 = y + (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_vborder);
+               w2 = width;
+               h2 = height - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_vborder * 2);
+               target = window;
+
+               /* If we are currently drawing the right-most tab (any state)... */
+               if (widget->allocation.x + widget->allocation.width - border_width == x + width)
+                 {
+                   x2--;
+                   w2--;
+                 }
              }
 
            if (xp_theme_draw (target, tab_part, style, x2, y2, w2, h2, state_type, NULL /*area*/))
@@ -2449,12 +2500,31 @@ draw_extension (GtkStyle * style,
                           g_object_unref (pixbuf);
                           pixbuf = rotated;
 
-                          if (real_gap_side == GTK_POS_RIGHT || real_gap_side == GTK_POS_LEFT)
+                          if (real_gap_side == GTK_POS_RIGHT)
+                            {
+                              x2 = x + (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_hborder);
+                              y2 = y;
+                              w2 = width - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_hborder);
+                              h2 = height;
+
+                              if (widget->allocation.y + widget->allocation.height - border_width == y + height &&
+                                  state_type == GTK_STATE_NORMAL)
+                                {
+                                  h2--;
+                                }
+                            }
+                          else if (real_gap_side == GTK_POS_LEFT)
                             {
                               x2 = x;
                               y2 = y;
-                              w2 = width;
+                              w2 = width - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_hborder);
                               h2 = height;
+
+                              if (widget->allocation.y + widget->allocation.height - border_width == y + height &&
+                                  state_type == GTK_STATE_NORMAL)
+                                {
+                                  h2--;
+                                }
                             }
 
                           gdk_draw_pixbuf (window, NULL, pixbuf, 0, 0, x2, y2, w2, h2, GDK_RGB_DITHER_NONE, 0, 0);
@@ -2508,12 +2578,46 @@ draw_box_gap (GtkStyle * style, GdkWindow * window, GtkStateType state_type,
 {
     if (GTK_IS_NOTEBOOK (widget) && detail && !strcmp (detail, "notebook"))
        {
-           if (xp_theme_draw (window, XP_THEME_ELEMENT_TAB_PANE, style, x,
-                                 y, width, height, state_type, area))
+           GtkNotebook *notebook = GTK_NOTEBOOK (widget);
+           int side = gtk_notebook_get_tab_pos (notebook);
+           int x2 = x, y2 = y, w2 = width, h2 = height;
+
+           if (side == GTK_POS_TOP)
+             {
+               x2 = x;
+               y2 = y - notebook->tab_vborder;
+               w2 = width;
+               h2 = height + notebook->tab_vborder * 2;
+             }
+           else if (side == GTK_POS_BOTTOM)
+             {
+               x2 = x;
+               y2 = y;
+               w2 = width;
+               h2 = height + notebook->tab_vborder * 2;
+             }
+           else if (side == GTK_POS_LEFT)
+             {
+               x2 = x - notebook->tab_hborder;
+               y2 = y;
+               w2 = width + notebook->tab_hborder;
+               h2 = height;
+             }
+           else if (side == GTK_POS_RIGHT)
+             {
+               x2 = x;
+               y2 = y;
+               w2 = width + notebook->tab_hborder * 2;
+               h2 = height;
+             }
+
+           if (xp_theme_draw (window, XP_THEME_ELEMENT_TAB_PANE, style,
+                              x2, y2, w2, h2, state_type, area))
                {
                    return;
                }
        }
+
     parent_class->draw_box_gap (style, window, state_type, shadow_type,
                                area, widget, detail, x, y, width, height,
                                gap_side, gap_x, gap_width);